//=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
// DESCRICAO:
//  Testa a classe DiscreteFourierTransform
//________________________________________________________
// A.Z. - 03/07 => Criacao
//=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
#include <vector>
#include <iostream>
#include "dft.hpp"
#include "aborta.hpp"
#include "gnuplot.hpp"
#include "meusTipos.hpp"
#include "readKeyboard.hpp"
using namespace std;


int main( void ){

  // Cria os dados
  MTci Nd = 100;
  MTcd f1=1.0/10.0, f2=1.0/30.0;
  MTvd t(Nd),y(Nd);
  for( int i=0; i<Nd; i++ ){
    t[i] = i;
    double x = 2*M_PI*i;
    y[i] = 5*cos(f1*x) + 1*cos(f2*x);
  }


  // Plota os dados
  Gnuplot gp1;
  gp1.plotWith("points lt 3 pt 7 ps 1.1");
  gp1.plot(t,y);
  gp1.plotWith("lines 3");
  gp1("f1 = "+ntos(f1));
  gp1("f2 = "+ntos(f2));
  gp1("set samples 1000");
  gp1.replotEquation("5*cos(2*pi*f1*x)+cos(2*pi*f2*x)");
  

  // Calcula a Transformada
  DiscreteFourierTransform dft;
  dft.push_dataF(t,y,10*Nd);
  MTcvd freq = dft.frequencies();
  MTcvd P    = dft.amplitude();
  

  // Plota a trasformada
  Gnuplot gp2;
  gp2.plotWith("lines 3");
  gp2.plot(freq,P);
  


  // Finaliza
  cout << "Pressione qualquer tecla para encerrar." << endl;
  readKeyboard();


  return 0;
}
